package ar.uba.fi.algo3.modelo.nave;

import java.util.ArrayList;    

import fiuba.algo3.titiritero.modelo.ObjetoPosicionable;

import ar.uba.fi.algo3.auxiliares.Direccion;
import ar.uba.fi.algo3.auxiliares.Posicion;
import ar.uba.fi.algo3.modelo.CampoBatalla;
import ar.uba.fi.algo3.modelo.Pieza;

public abstract class Nave extends Pieza implements ObjetoPosicionable {
    
    public ArrayList<ComponenteNave> componentesNave;
    protected Posicion posicion; 
    public Posicion componenteDelantera;
    public Posicion siguienteComponenteDelantera;
    public Posicion componenteTrasera;
    public Posicion siguienteComponenteTrasera;
    public Direccion direccion;
	public int numeroDeComponentesSanos;
     
    public Nave(ArrayList<ComponenteNave> componentesNave, CampoBatalla campoBatalla,Direccion direccion, Posicion unaPosicion){ 
    	
    	super(unaPosicion, campoBatalla);
    	this.componentesNave= componentesNave;
    	this.direccion= direccion;
    	this.componenteDelantera=unaPosicion;
    }    
    
    public Direccion getDireccion(){
    	
    	return this.direccion;
    }
    
    public void setDireccion(Direccion unaDireccion){
    	
    	this.direccion=unaDireccion;
    }

	public int obtenerNumeroDeComponentes (){
		
		return (this.componentesNave).size();
	}
	
	public ArrayList<ComponenteNave> obtenerComponentes(){
		
		return this.componentesNave;
	} 
		
	public Posicion getPosicionEnMovimiento(){
		
		return this.componenteDelantera;
	}
	
	public void moverNaves(){

		this.calcularExtremos();
		
		if ((!(campoBatalla.fueraDelCampoBatalla(siguienteComponenteDelantera))) && 
					((!campoBatalla.fueraDelCampoBatalla(siguienteComponenteTrasera)))){
			
			this.actualizar();			
		}
		else {
			
			this.direccion=direccion.getDireccionOpuesta();
			this.moverNaves();										
		}
	}
	
	private void actualizar() {

		for(ComponenteNave unaComponente : componentesNave){
            
			unaComponente.setPosicion(this.direccion.siguientePosicion(unaComponente.getPosicion()));   
		}		
		this.componenteDelantera=this.siguienteComponenteDelantera;
		this.componenteTrasera= this.siguienteComponenteTrasera;		
	}
	
	public void calcularExtremos (){
		
		this.componenteDelantera= this.obtenerComponentes().get(0).getPosicion();
		this.componenteTrasera= this.obtenerComponentes().get(componentesNave.size()-1).getPosicion();
		
		this.siguienteComponenteDelantera= direccion.siguientePosicion(componenteDelantera);
		this.siguienteComponenteTrasera= direccion.siguientePosicion(componenteTrasera);
	}
			
	public boolean noQuedanPartes (){
		
		for(ComponenteNave unaComponente : componentesNave){
               
                if(unaComponente.sigueFuncionando()){
             
                	return false;
                }
        }
        return true;		
	}
	
	public int cantidadComponentesNave (){
		
		return (this.obtenerNumeroDeComponentesSanos());
	}
	
	public int obtenerNumeroDeComponentesSanos() {

		this.calcularComponentesSanos();
		return this.numeroDeComponentesSanos;
	}
	
	private void calcularComponentesSanos(){

		this.numeroDeComponentesSanos= this.obtenerNumeroDeComponentes();
		for(ComponenteNave unaComponente : componentesNave){
			
			if (unaComponente.getDureza()==0){
				this.numeroDeComponentesSanos-=1;
			}
		}
	}

	public void destruirNave(){

		this.vive=false;
	}

	public abstract String getNombre();	
}
